package com.demo.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @author linchong
 * @version 1.0
 * @Date: 2022-05-14 13:57
 * @Description: ConstructorCollector$
 *
 *  通过Class对象可以获取某个类中的：构造方法
 *      1）批量的方法
 *          public Constructor[] getConstructors():所有"公有的"构造方法
 *          public Constructor[] getDeclaredConstructors():获取多有的构造方法，含私有的、受保护、默认、公有
 *      2）获取单个的方法，并调用：
 *          public Constructor getConstructor(Class ... parameterTypes):获取单个“公有”的构造方法
 *          public Constructor getDeclaredConstructor(Class ... parameterTypes):获取某个构造方法，可以是私有的、默认的、公有的、受保护的
 *
 *
 *          构造方法的调用
 *          Constructor->newInstance(Object... initargs)
 *
 *
 */
public class ConstructorCollector {

	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
		Class clazz = Class.forName("com.demo.reflect.ReflectTarget");
		//1.获取所有的公有构造方法
		System.out.println("************1.获取所有公有构造方法******************");
		Constructor[] constructors = clazz.getConstructors();
		for (Constructor constructor : constructors) {
			System.out.println(constructor);
		}

		System.out.println("************2.获取所有构造方法(私有、受保护、默认、公有)******************");
		constructors = clazz.getDeclaredConstructors();
		for (Constructor constructor : constructors) {
			System.out.println(constructor);
		}

		System.out.println("************3.获取单个公有构造方法******************");
		Constructor constructor = clazz.getConstructor(String.class, int.class);
		System.out.println(constructor);
		System.out.println("************4.获取单个构造方法(含私有、受保护、默认、公有)******************");
		constructor = clazz.getDeclaredConstructor(int.class);
		System.out.println(constructor);
		System.out.println("************5.调用私有构造方法创建实例*************");
		//暴力访问
		constructor.setAccessible(true);
		ReflectTarget instance = (ReflectTarget) constructor.newInstance(1);



	}
}
